Autogenerated HTML docs for v2.4.0-rc0
diff --git a/RelNotes/2.4.0.txt b/RelNotes/2.4.0.txt index 386c75d..53c9127 100644 --- a/RelNotes/2.4.0.txt +++ b/RelNotes/2.4.0.txt
@@ -186,6 +186,11 @@ finish) and also add code to prevent such abuse in the run-command helper. + * People often forget to chain the commands in their test together + with &&, leaving a failure from an earlier command in the test go + unnoticed. The new GIT_TEST_CHAIN_LINT mechanism allows you to + catch such a mistake more easily. + Also contains various documentation updates and code clean-ups. @@ -464,3 +469,5 @@ (merge 7032054 nd/doc-git-index-version later to maint). (merge e869c5e tg/test-index-v4 later to maint). (merge 599d223 jk/simplify-csum-file-sha1fd-check later to maint). + (merge 260d585 sg/completion-gitcomp-nl-for-refs later to maint). + (merge 777c55a jc/report-path-error-to-dir later to maint).
diff --git a/howto-index.html b/howto-index.html index d6cb2ee..9eec11e 100644 --- a/howto-index.html +++ b/howto-index.html
@@ -883,7 +883,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:10 PST +Last updated 2015-03-26 13:52:17 PDT </div> </div> </body>
diff --git a/howto/keep-canonical-history-correct.html b/howto/keep-canonical-history-correct.html index 6a1fd18..465e211 100644 --- a/howto/keep-canonical-history-correct.html +++ b/howto/keep-canonical-history-correct.html
@@ -936,7 +936,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:16 PST +Last updated 2015-03-26 13:52:22 PDT </div> </div> </body>
diff --git a/howto/maintain-git.html b/howto/maintain-git.html index 9e37e79..da0e401 100644 --- a/howto/maintain-git.html +++ b/howto/maintain-git.html
@@ -1433,7 +1433,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:16 PST +Last updated 2015-03-26 13:52:23 PDT </div> </div> </body>
diff --git a/howto/new-command.html b/howto/new-command.html index 743beb5..469613d 100644 --- a/howto/new-command.html +++ b/howto/new-command.html
@@ -859,7 +859,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:12 PST +Last updated 2015-03-26 13:52:19 PDT </div> </div> </body>
diff --git a/howto/rebase-from-internal-branch.html b/howto/rebase-from-internal-branch.html index 9e56258..806c432 100644 --- a/howto/rebase-from-internal-branch.html +++ b/howto/rebase-from-internal-branch.html
@@ -893,7 +893,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:16 PST +Last updated 2015-03-26 13:52:22 PDT </div> </div> </body>
diff --git a/howto/rebuild-from-update-hook.html b/howto/rebuild-from-update-hook.html index ef6f9d0..98aefbf 100644 --- a/howto/rebuild-from-update-hook.html +++ b/howto/rebuild-from-update-hook.html
@@ -845,7 +845,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:16 PST +Last updated 2015-03-26 13:52:22 PDT </div> </div> </body>
diff --git a/howto/recover-corrupted-blob-object.html b/howto/recover-corrupted-blob-object.html index b3e809a..c167633 100644 --- a/howto/recover-corrupted-blob-object.html +++ b/howto/recover-corrupted-blob-object.html
@@ -878,7 +878,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:15 PST +Last updated 2015-03-26 13:52:22 PDT </div> </div> </body>
diff --git a/howto/recover-corrupted-object-harder.html b/howto/recover-corrupted-object-harder.html index 9935321..4cfc5c4 100644 --- a/howto/recover-corrupted-object-harder.html +++ b/howto/recover-corrupted-object-harder.html
@@ -953,7 +953,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:15 PST +Last updated 2015-03-26 13:52:22 PDT </div> </div> </body>
diff --git a/howto/revert-a-faulty-merge.html b/howto/revert-a-faulty-merge.html index 035f8cf..7a8d3d0 100644 --- a/howto/revert-a-faulty-merge.html +++ b/howto/revert-a-faulty-merge.html
@@ -1023,7 +1023,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:15 PST +Last updated 2015-03-26 13:52:21 PDT </div> </div> </body>
diff --git a/howto/revert-branch-rebase.html b/howto/revert-branch-rebase.html index 0cc6407..9926b7a 100644 --- a/howto/revert-branch-rebase.html +++ b/howto/revert-branch-rebase.html
@@ -905,7 +905,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:12 PST +Last updated 2015-03-26 13:52:19 PDT </div> </div> </body>
diff --git a/howto/separating-topic-branches.html b/howto/separating-topic-branches.html index cedcc64..7be8650 100644 --- a/howto/separating-topic-branches.html +++ b/howto/separating-topic-branches.html
@@ -839,7 +839,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:14 PST +Last updated 2015-03-26 13:52:21 PDT </div> </div> </body>
diff --git a/howto/setup-git-server-over-http.html b/howto/setup-git-server-over-http.html index dbd0560..307d2a6 100644 --- a/howto/setup-git-server-over-http.html +++ b/howto/setup-git-server-over-http.html
@@ -1069,7 +1069,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:14 PST +Last updated 2015-03-26 13:52:21 PDT </div> </div> </body>
diff --git a/howto/update-hook-example.html b/howto/update-hook-example.html index a07d6c9..130b7e0 100644 --- a/howto/update-hook-example.html +++ b/howto/update-hook-example.html
@@ -928,7 +928,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:14 PST +Last updated 2015-03-26 13:52:20 PDT </div> </div> </body>
diff --git a/howto/use-git-daemon.html b/howto/use-git-daemon.html index e7aa9ab..549507d 100644 --- a/howto/use-git-daemon.html +++ b/howto/use-git-daemon.html
@@ -789,7 +789,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:13 PST +Last updated 2015-03-26 13:52:20 PDT </div> </div> </body>
diff --git a/howto/using-merge-subtree.html b/howto/using-merge-subtree.html index 908b334..381202e 100644 --- a/howto/using-merge-subtree.html +++ b/howto/using-merge-subtree.html
@@ -846,7 +846,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:13 PST +Last updated 2015-03-26 13:52:19 PDT </div> </div> </body>
diff --git a/howto/using-signed-tag-in-pull-request.html b/howto/using-signed-tag-in-pull-request.html index 057890e..936cbfd 100644 --- a/howto/using-signed-tag-in-pull-request.html +++ b/howto/using-signed-tag-in-pull-request.html
@@ -950,7 +950,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-05 13:51:13 PST +Last updated 2015-03-26 13:52:20 PDT </div> </div> </body>
diff --git a/technical/api-index.html b/technical/api-index.html index c9cb464..5bd8bc9 100644 --- a/technical/api-index.html +++ b/technical/api-index.html
@@ -898,7 +898,7 @@ <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2015-02-25 15:55:40 PST +Last updated 2015-03-26 13:52:31 PDT </div> </div> </body>
diff --git a/technical/api-strbuf.html b/technical/api-strbuf.html deleted file mode 100644 index f931c5b..0000000 --- a/technical/api-strbuf.html +++ /dev/null
@@ -1,1350 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" - "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> -<head> -<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 8.6.9" /> -<title>strbuf API</title> -<style type="text/css"> -/* Shared CSS for AsciiDoc xhtml11 and html5 backends */ - -/* Default font. */ -body { - font-family: Georgia,serif; -} - -/* Title font. */ -h1, h2, h3, h4, h5, h6, -div.title, caption.title, -thead, p.table.header, -#toctitle, -#author, #revnumber, #revdate, #revremark, -#footer { - font-family: Arial,Helvetica,sans-serif; -} - -body { - margin: 1em 5% 1em 5%; -} - -a { - color: blue; - text-decoration: underline; -} -a:visited { - color: fuchsia; -} - -em { - font-style: italic; - color: navy; -} - -strong { - font-weight: bold; - color: #083194; -} - -h1, h2, h3, h4, h5, h6 { - color: #527bbd; - margin-top: 1.2em; - margin-bottom: 0.5em; - line-height: 1.3; -} - -h1, h2, h3 { - border-bottom: 2px solid silver; -} -h2 { - padding-top: 0.5em; -} -h3 { - float: left; -} -h3 + * { - clear: left; -} -h5 { - font-size: 1.0em; -} - -div.sectionbody { - margin-left: 0; -} - -hr { - border: 1px solid silver; -} - -p { - margin-top: 0.5em; - margin-bottom: 0.5em; -} - -ul, ol, li > p { - margin-top: 0; -} -ul > li { color: #aaa; } -ul > li > * { color: black; } - -.monospaced, code, pre { - font-family: "Courier New", Courier, monospace; - font-size: inherit; - color: navy; - padding: 0; - margin: 0; -} -pre { - white-space: pre-wrap; -} - -#author { - color: #527bbd; - font-weight: bold; - font-size: 1.1em; -} -#email { -} -#revnumber, #revdate, #revremark { -} - -#footer { - font-size: small; - border-top: 2px solid silver; - padding-top: 0.5em; - margin-top: 4.0em; -} -#footer-text { - float: left; - padding-bottom: 0.5em; -} -#footer-badges { - float: right; - padding-bottom: 0.5em; -} - -#preamble { - margin-top: 1.5em; - margin-bottom: 1.5em; -} -div.imageblock, div.exampleblock, div.verseblock, -div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, -div.admonitionblock { - margin-top: 1.0em; - margin-bottom: 1.5em; -} -div.admonitionblock { - margin-top: 2.0em; - margin-bottom: 2.0em; - margin-right: 10%; - color: #606060; -} - -div.content { /* Block element content. */ - padding: 0; -} - -/* Block element titles. */ -div.title, caption.title { - color: #527bbd; - font-weight: bold; - text-align: left; - margin-top: 1.0em; - margin-bottom: 0.5em; -} -div.title + * { - margin-top: 0; -} - -td div.title:first-child { - margin-top: 0.0em; -} -div.content div.title:first-child { - margin-top: 0.0em; -} -div.content + div.title { - margin-top: 0.0em; -} - -div.sidebarblock > div.content { - background: #ffffee; - border: 1px solid #dddddd; - border-left: 4px solid #f0f0f0; - padding: 0.5em; -} - -div.listingblock > div.content { - border: 1px solid #dddddd; - border-left: 5px solid #f0f0f0; - background: #f8f8f8; - padding: 0.5em; -} - -div.quoteblock, div.verseblock { - padding-left: 1.0em; - margin-left: 1.0em; - margin-right: 10%; - border-left: 5px solid #f0f0f0; - color: #888; -} - -div.quoteblock > div.attribution { - padding-top: 0.5em; - text-align: right; -} - -div.verseblock > pre.content { - font-family: inherit; - font-size: inherit; -} -div.verseblock > div.attribution { - padding-top: 0.75em; - text-align: left; -} -/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ -div.verseblock + div.attribution { - text-align: left; -} - -div.admonitionblock .icon { - vertical-align: top; - font-size: 1.1em; - font-weight: bold; - text-decoration: underline; - color: #527bbd; - padding-right: 0.5em; -} -div.admonitionblock td.content { - padding-left: 0.5em; - border-left: 3px solid #dddddd; -} - -div.exampleblock > div.content { - border-left: 3px solid #dddddd; - padding-left: 0.5em; -} - -div.imageblock div.content { padding-left: 0; } -span.image img { border-style: none; vertical-align: text-bottom; } -a.image:visited { color: white; } - -dl { - margin-top: 0.8em; - margin-bottom: 0.8em; -} -dt { - margin-top: 0.5em; - margin-bottom: 0; - font-style: normal; - color: navy; -} -dd > *:first-child { - margin-top: 0.1em; -} - -ul, ol { - list-style-position: outside; -} -ol.arabic { - list-style-type: decimal; -} -ol.loweralpha { - list-style-type: lower-alpha; -} -ol.upperalpha { - list-style-type: upper-alpha; -} -ol.lowerroman { - list-style-type: lower-roman; -} -ol.upperroman { - list-style-type: upper-roman; -} - -div.compact ul, div.compact ol, -div.compact p, div.compact p, -div.compact div, div.compact div { - margin-top: 0.1em; - margin-bottom: 0.1em; -} - -tfoot { - font-weight: bold; -} -td > div.verse { - white-space: pre; -} - -div.hdlist { - margin-top: 0.8em; - margin-bottom: 0.8em; -} -div.hdlist tr { - padding-bottom: 15px; -} -dt.hdlist1.strong, td.hdlist1.strong { - font-weight: bold; -} -td.hdlist1 { - vertical-align: top; - font-style: normal; - padding-right: 0.8em; - color: navy; -} -td.hdlist2 { - vertical-align: top; -} -div.hdlist.compact tr { - margin: 0; - padding-bottom: 0; -} - -.comment { - background: yellow; -} - -.footnote, .footnoteref { - font-size: 0.8em; -} - -span.footnote, span.footnoteref { - vertical-align: super; -} - -#footnotes { - margin: 20px 0 20px 0; - padding: 7px 0 0 0; -} - -#footnotes div.footnote { - margin: 0 0 5px 0; -} - -#footnotes hr { - border: none; - border-top: 1px solid silver; - height: 1px; - text-align: left; - margin-left: 0; - width: 20%; - min-width: 100px; -} - -div.colist td { - padding-right: 0.5em; - padding-bottom: 0.3em; - vertical-align: top; -} -div.colist td img { - margin-top: 0.3em; -} - -@media print { - #footer-badges { display: none; } -} - -#toc { - margin-bottom: 2.5em; -} - -#toctitle { - color: #527bbd; - font-size: 1.1em; - font-weight: bold; - margin-top: 1.0em; - margin-bottom: 0.1em; -} - -div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { - margin-top: 0; - margin-bottom: 0; -} -div.toclevel2 { - margin-left: 2em; - font-size: 0.9em; -} -div.toclevel3 { - margin-left: 4em; - font-size: 0.9em; -} -div.toclevel4 { - margin-left: 6em; - font-size: 0.9em; -} - -span.aqua { color: aqua; } -span.black { color: black; } -span.blue { color: blue; } -span.fuchsia { color: fuchsia; } -span.gray { color: gray; } -span.green { color: green; } -span.lime { color: lime; } -span.maroon { color: maroon; } -span.navy { color: navy; } -span.olive { color: olive; } -span.purple { color: purple; } -span.red { color: red; } -span.silver { color: silver; } -span.teal { color: teal; } -span.white { color: white; } -span.yellow { color: yellow; } - -span.aqua-background { background: aqua; } -span.black-background { background: black; } -span.blue-background { background: blue; } -span.fuchsia-background { background: fuchsia; } -span.gray-background { background: gray; } -span.green-background { background: green; } -span.lime-background { background: lime; } -span.maroon-background { background: maroon; } -span.navy-background { background: navy; } -span.olive-background { background: olive; } -span.purple-background { background: purple; } -span.red-background { background: red; } -span.silver-background { background: silver; } -span.teal-background { background: teal; } -span.white-background { background: white; } -span.yellow-background { background: yellow; } - -span.big { font-size: 2em; } -span.small { font-size: 0.6em; } - -span.underline { text-decoration: underline; } -span.overline { text-decoration: overline; } -span.line-through { text-decoration: line-through; } - -div.unbreakable { page-break-inside: avoid; } - - -/* - * xhtml11 specific - * - * */ - -div.tableblock { - margin-top: 1.0em; - margin-bottom: 1.5em; -} -div.tableblock > table { - border: 3px solid #527bbd; -} -thead, p.table.header { - font-weight: bold; - color: #527bbd; -} -p.table { - margin-top: 0; -} -/* Because the table frame attribute is overriden by CSS in most browsers. */ -div.tableblock > table[frame="void"] { - border-style: none; -} -div.tableblock > table[frame="hsides"] { - border-left-style: none; - border-right-style: none; -} -div.tableblock > table[frame="vsides"] { - border-top-style: none; - border-bottom-style: none; -} - - -/* - * html5 specific - * - * */ - -table.tableblock { - margin-top: 1.0em; - margin-bottom: 1.5em; -} -thead, p.tableblock.header { - font-weight: bold; - color: #527bbd; -} -p.tableblock { - margin-top: 0; -} -table.tableblock { - border-width: 3px; - border-spacing: 0px; - border-style: solid; - border-color: #527bbd; - border-collapse: collapse; -} -th.tableblock, td.tableblock { - border-width: 1px; - padding: 4px; - border-style: solid; - border-color: #527bbd; -} - -table.tableblock.frame-topbot { - border-left-style: hidden; - border-right-style: hidden; -} -table.tableblock.frame-sides { - border-top-style: hidden; - border-bottom-style: hidden; -} -table.tableblock.frame-none { - border-style: hidden; -} - -th.tableblock.halign-left, td.tableblock.halign-left { - text-align: left; -} -th.tableblock.halign-center, td.tableblock.halign-center { - text-align: center; -} -th.tableblock.halign-right, td.tableblock.halign-right { - text-align: right; -} - -th.tableblock.valign-top, td.tableblock.valign-top { - vertical-align: top; -} -th.tableblock.valign-middle, td.tableblock.valign-middle { - vertical-align: middle; -} -th.tableblock.valign-bottom, td.tableblock.valign-bottom { - vertical-align: bottom; -} - - -/* - * manpage specific - * - * */ - -body.manpage h1 { - padding-top: 0.5em; - padding-bottom: 0.5em; - border-top: 2px solid silver; - border-bottom: 2px solid silver; -} -body.manpage h2 { - border-style: none; -} -body.manpage div.sectionbody { - margin-left: 3em; -} - -@media print { - body.manpage div#toc { display: none; } -} - - -</style> -<script type="text/javascript"> -/*<+'])'); - // Function that scans the DOM tree for header elements (the DOM2 - // nodeIterator API would be a better technique but not supported by all - // browsers). - var iterate = function (el) { - for (var i = el.firstChild; i != null; i = i.nextSibling) { - if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { - var mo = re.exec(i.tagName); - if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") { - result[result.length] = new TocEntry(i, getText(i), mo[1]-1); - } - iterate(i); - } - } - } - iterate(el); - return result; - } - - var toc = document.getElementById("toc"); - if (!toc) { - return; - } - - // Delete existing TOC entries in case we're reloading the TOC. - var tocEntriesToRemove = []; - var i; - for (i = 0; i < toc.childNodes.length; i++) { - var entry = toc.childNodes[i]; - if (entry.nodeName.toLowerCase() == 'div' - && entry.getAttribute("class") - && entry.getAttribute("class").match(/^toclevel/)) - tocEntriesToRemove.push(entry); - } - for (i = 0; i < tocEntriesToRemove.length; i++) { - toc.removeChild(tocEntriesToRemove[i]); - } - - // Rebuild TOC entries. - var entries = tocEntries(document.getElementById("content"), toclevels); - for (var i = 0; i < entries.length; ++i) { - var entry = entries[i]; - if (entry.element.id == "") - entry.element.id = "_toc_" + i; - var a = document.createElement("a"); - a.href = "#" + entry.element.id; - a.appendChild(document.createTextNode(entry.text)); - var div = document.createElement("div"); - div.appendChild(a); - div.className = "toclevel" + entry.toclevel; - toc.appendChild(div); - } - if (entries.length == 0) - toc.parentNode.removeChild(toc); -}, - - -///////////////////////////////////////////////////////////////////// -// Footnotes generator -///////////////////////////////////////////////////////////////////// - -/* Based on footnote generation code from: - * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html - */ - -footnotes: function () { - // Delete existing footnote entries in case we're reloading the footnodes. - var i; - var noteholder = document.getElementById("footnotes"); - if (!noteholder) { - return; - } - var entriesToRemove = []; - for (i = 0; i < noteholder.childNodes.length; i++) { - var entry = noteholder.childNodes[i]; - if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote") - entriesToRemove.push(entry); - } - for (i = 0; i < entriesToRemove.length; i++) { - noteholder.removeChild(entriesToRemove[i]); - } - - // Rebuild footnote entries. - var cont = document.getElementById("content"); - var spans = cont.getElementsByTagName("span"); - var refs = {}; - var n = 0; - for (i=0; i<spans.length; i++) { - if (spans[i].className == "footnote") { - n++; - var note = spans[i].getAttribute("data-note"); - if (!note) { - // Use [\s\S] in place of . so multi-line matches work. - // Because JavaScript has no s (dotall) regex flag. - note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1]; - spans[i].innerHTML = - "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + - "' title='View footnote' class='footnote'>" + n + "</a>]"; - spans[i].setAttribute("data-note", note); - } - noteholder.innerHTML += - "<div class='footnote' id='_footnote_" + n + "'>" + - "<a href='#_footnoteref_" + n + "' title='Return to text'>" + - n + "</a>. " + note + "</div>"; - var id =spans[i].getAttribute("id"); - if (id != null) refs["#"+id] = n; - } - } - if (n == 0) - noteholder.parentNode.removeChild(noteholder); - else { - // Process footnoterefs. - for (i=0; i<spans.length; i++) { - if (spans[i].className == "footnoteref") { - var href = spans[i].getElementsByTagName("a")[0].getAttribute("href"); - href = href.match(/#.*/)[0]; // Because IE return full URL. - n = refs[href]; - spans[i].innerHTML = - "[<a href='#_footnote_" + n + - "' title='View footnote' class='footnote'>" + n + "</a>]"; - } - } - } -}, - -install: function(toclevels) { - var timerId; - - function reinstall() { - asciidoc.footnotes(); - if (toclevels) { - asciidoc.toc(toclevels); - } - } - - function reinstallAndRemoveTimer() { - clearInterval(timerId); - reinstall(); - } - - timerId = setInterval(reinstall, 500); - if (document.addEventListener) - document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false); - else - window.onload = reinstallAndRemoveTimer; -} - -} -asciidoc.install(); -/*]]>*/ -</script> -</head> -<body class="article"> -<div id="header"> -<h1>strbuf API</h1> -</div> -<div id="content"> -<div id="preamble"> -<div class="sectionbody"> -<div class="paragraph"><p>strbuf’s are meant to be used with all the usual C string and memory -APIs. Given that the length of the buffer is known, it’s often better to -use the mem* functions than a str* one (memchr vs. strchr e.g.). -Though, one has to be careful about the fact that str* functions often -stop on NULs and that strbufs may have embedded NULs.</p></div> -<div class="paragraph"><p>A strbuf is NUL terminated for convenience, but no function in the -strbuf API actually relies on the string being free of NULs.</p></div> -<div class="paragraph"><p>strbufs have some invariants that are very important to keep in mind:</p></div> -<div class="olist arabic"><ol class="arabic"> -<li> -<p> -The <code>buf</code> member is never NULL, so it can be used in any usual C -string operations safely. strbuf’s <em>have</em> to be initialized either by -<code>strbuf_init()</code> or by <code>= STRBUF_INIT</code> before the invariants, though. -</p> -<div class="paragraph"><p>Do <strong>not</strong> assume anything on what <code>buf</code> really is (e.g. if it is -allocated memory or not), use <code>strbuf_detach()</code> to unwrap a memory -buffer from its strbuf shell in a safe way. That is the sole supported -way. This will give you a malloced buffer that you can later <code>free()</code>.</p></div> -<div class="paragraph"><p>However, it is totally safe to modify anything in the string pointed by -the <code>buf</code> member, between the indices <code>0</code> and <code>len-1</code> (inclusive).</p></div> -</li> -<li> -<p> -The <code>buf</code> member is a byte array that has at least <code>len + 1</code> bytes - allocated. The extra byte is used to store a <code>'\0'</code>, allowing the - <code>buf</code> member to be a valid C-string. Every strbuf function ensure this - invariant is preserved. -</p> -<div class="admonitionblock"> -<table><tr> -<td class="icon"> -<div class="title">Note</div> -</td> -<td class="content">It is OK to "play" with the buffer directly if you work it this - way:</td> -</tr></table> -</div> -<div class="listingblock"> -<div class="content"> -<pre><code>strbuf_grow(sb, SOME_SIZE); <b><1></b> -strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE);</code></pre> -</div></div> -<div class="colist arabic"><ol> -<li> -<p> -Here, the memory array starting at <code>sb->buf</code>, and of length -<code>strbuf_avail(sb)</code> is all yours, and you can be sure that -<code>strbuf_avail(sb)</code> is at least <code>SOME_SIZE</code>. -</p> -<div class="admonitionblock"> -<table><tr> -<td class="icon"> -<div class="title">Note</div> -</td> -<td class="content"><code>SOME_OTHER_SIZE</code> must be smaller or equal to <code>strbuf_avail(sb)</code>.</td> -</tr></table> -</div> -<div class="paragraph"><p>Doing so is safe, though if it has to be done in many places, adding the -missing API to the strbuf module is the way to go.</p></div> -<div class="admonitionblock"> -<table><tr> -<td class="icon"> -<div class="title">Warning</div> -</td> -<td class="content">Do <em>not</em> assume that the area that is yours is of size <code>alloc -- 1</code> even if it’s true in the current implementation. Alloc is somehow a -"private" member that should not be messed with. Use <code>strbuf_avail()</code> -instead.</td> -</tr></table> -</div> -</li> -</ol></div> -</li> -</ol></div> -</div> -</div> -<div class="sect1"> -<h2 id="_data_structures">Data structures</h2> -<div class="sectionbody"> -<div class="ulist"><ul> -<li> -<p> -<code>struct strbuf</code> -</p> -</li> -</ul></div> -<div class="paragraph"><p>This is the string buffer structure. The <code>len</code> member can be used to -determine the current length of the string, and <code>buf</code> member provides -access to the string itself.</p></div> -</div> -</div> -<div class="sect1"> -<h2 id="_functions">Functions</h2> -<div class="sectionbody"> -<div class="ulist"><ul> -<li> -<p> -Life cycle -</p> -<div class="dlist"><dl> -<dt class="hdlist1"> -<code>strbuf_init</code> -</dt> -<dd> -<p> - Initialize the structure. The second parameter can be zero or a bigger - number to allocate memory, in case you want to prevent further reallocs. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_release</code> -</dt> -<dd> -<p> - Release a string buffer and the memory it used. You should not use the - string buffer after using this function, unless you initialize it again. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_detach</code> -</dt> -<dd> -<p> - Detach the string from the strbuf and returns it; you now own the - storage the string occupies and it is your responsibility from then on - to release it with <code>free(3)</code> when you are done with it. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_attach</code> -</dt> -<dd> -<p> - Attach a string to a buffer. You should specify the string to attach, - the current length of the string and the amount of allocated memory. - The amount must be larger than the string length, because the string you - pass is supposed to be a NUL-terminated string. This string <em>must</em> be - malloc()ed, and after attaching, the pointer cannot be relied upon - anymore, and neither be free()d directly. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_swap</code> -</dt> -<dd> -<p> - Swap the contents of two string buffers. -</p> -</dd> -</dl></div> -</li> -<li> -<p> -Related to the size of the buffer -</p> -<div class="dlist"><dl> -<dt class="hdlist1"> -<code>strbuf_avail</code> -</dt> -<dd> -<p> - Determine the amount of allocated but unused memory. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_grow</code> -</dt> -<dd> -<p> - Ensure that at least this amount of unused memory is available after - <code>len</code>. This is used when you know a typical size for what you will add - and want to avoid repetitive automatic resizing of the underlying buffer. - This is never a needed operation, but can be critical for performance in - some cases. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_setlen</code> -</dt> -<dd> -<p> - Set the length of the buffer to a given value. This function does <strong>not</strong> - allocate new memory, so you should not perform a <code>strbuf_setlen()</code> to a - length that is larger than <code>len + strbuf_avail()</code>. <code>strbuf_setlen()</code> is - just meant as a <em>please fix invariants from this strbuf I just messed - with</em>. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_reset</code> -</dt> -<dd> -<p> - Empty the buffer by setting the size of it to zero. -</p> -</dd> -</dl></div> -</li> -<li> -<p> -Related to the contents of the buffer -</p> -<div class="dlist"><dl> -<dt class="hdlist1"> -<code>strbuf_trim</code> -</dt> -<dd> -<p> - Strip whitespace from the beginning and end of a string. - Equivalent to performing <code>strbuf_rtrim()</code> followed by <code>strbuf_ltrim()</code>. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_rtrim</code> -</dt> -<dd> -<p> - Strip whitespace from the end of a string. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_ltrim</code> -</dt> -<dd> -<p> - Strip whitespace from the beginning of a string. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_reencode</code> -</dt> -<dd> -<p> - Replace the contents of the strbuf with a reencoded form. Returns -1 - on error, 0 on success. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_tolower</code> -</dt> -<dd> -<p> - Lowercase each character in the buffer using <code>tolower</code>. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_cmp</code> -</dt> -<dd> -<p> - Compare two buffers. Returns an integer less than, equal to, or greater - than zero if the first buffer is found, respectively, to be less than, - to match, or be greater than the second buffer. -</p> -</dd> -</dl></div> -</li> -<li> -<p> -Adding data to the buffer -</p> -</li> -</ul></div> -<div class="admonitionblock"> -<table><tr> -<td class="icon"> -<div class="title">Note</div> -</td> -<td class="content">All of the functions in this section will grow the buffer as necessary. -If they fail for some reason other than memory shortage and the buffer hadn’t -been allocated before (i.e. the <code>struct strbuf</code> was set to <code>STRBUF_INIT</code>), -then they will free() it.</td> -</tr></table> -</div> -<div class="dlist"><dl> -<dt class="hdlist1"> -<code>strbuf_addch</code> -</dt> -<dd> -<p> - Add a single character to the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_addchars</code> -</dt> -<dd> -<p> - Add a character the specified number of times to the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_insert</code> -</dt> -<dd> -<p> - Insert data to the given position of the buffer. The remaining contents - will be shifted, not overwritten. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_remove</code> -</dt> -<dd> -<p> - Remove given amount of data from a given position of the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_splice</code> -</dt> -<dd> -<p> - Remove the bytes between <code>pos..pos+len</code> and replace it with the given - data. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_add_commented_lines</code> -</dt> -<dd> -<p> - Add a NUL-terminated string to the buffer. Each line will be prepended - by a comment character and a blank. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_add</code> -</dt> -<dd> -<p> - Add data of given length to the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_addstr</code> -</dt> -<dd> -<p> -Add a NUL-terminated string to the buffer. -</p> -<div class="admonitionblock"> -<table><tr> -<td class="icon"> -<div class="title">Note</div> -</td> -<td class="content">This function will <strong>always</strong> be implemented as an inline or a macro -that expands to:</td> -</tr></table> -</div> -<div class="listingblock"> -<div class="content"> -<pre><code>strbuf_add(..., s, strlen(s));</code></pre> -</div></div> -<div class="paragraph"><p>Meaning that this is efficient to write things like:</p></div> -<div class="listingblock"> -<div class="content"> -<pre><code>strbuf_addstr(sb, "immediate string");</code></pre> -</div></div> -</dd> -<dt class="hdlist1"> -<code>strbuf_addbuf</code> -</dt> -<dd> -<p> - Copy the contents of another buffer at the end of the current one. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_adddup</code> -</dt> -<dd> -<p> - Copy part of the buffer from a given position till a given length to the - end of the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_expand</code> -</dt> -<dd> -<p> - This function can be used to expand a format string containing - placeholders. To that end, it parses the string and calls the specified - function for every percent sign found. -</p> -<div class="paragraph"><p>The callback function is given a pointer to the character after the <code>%</code> -and a pointer to the struct strbuf. It is expected to add the expanded -version of the placeholder to the strbuf, e.g. to add a newline -character if the letter <code>n</code> appears after a <code>%</code>. The function returns -the length of the placeholder recognized and <code>strbuf_expand()</code> skips -over it.</p></div> -<div class="paragraph"><p>The format <code>%%</code> is automatically expanded to a single <code>%</code> as a quoting -mechanism; callers do not need to handle the <code>%</code> placeholder themselves, -and the callback function will not be invoked for this placeholder.</p></div> -<div class="paragraph"><p>All other characters (non-percent and not skipped ones) are copied -verbatim to the strbuf. If the callback returned zero, meaning that the -placeholder is unknown, then the percent sign is copied, too.</p></div> -<div class="paragraph"><p>In order to facilitate caching and to make it possible to give -parameters to the callback, <code>strbuf_expand()</code> passes a context pointer, -which can be used by the programmer of the callback as she sees fit.</p></div> -</dd> -<dt class="hdlist1"> -<code>strbuf_expand_dict_cb</code> -</dt> -<dd> -<p> - Used as callback for <code>strbuf_expand()</code>, expects an array of - struct strbuf_expand_dict_entry as context, i.e. pairs of - placeholder and replacement string. The array needs to be - terminated by an entry with placeholder set to NULL. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_addbuf_percentquote</code> -</dt> -<dd> -<p> - Append the contents of one strbuf to another, quoting any - percent signs ("%") into double-percents ("%%") in the - destination. This is useful for literal data to be fed to either - strbuf_expand or to the *printf family of functions. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_humanise_bytes</code> -</dt> -<dd> -<p> - Append the given byte size as a human-readable string (i.e. 12.23 KiB, - 3.50 MiB). -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_addf</code> -</dt> -<dd> -<p> - Add a formatted string to the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_commented_addf</code> -</dt> -<dd> -<p> - Add a formatted string prepended by a comment character and a - blank to the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_fread</code> -</dt> -<dd> -<p> - Read a given size of data from a FILE* pointer to the buffer. -</p> -<div class="admonitionblock"> -<table><tr> -<td class="icon"> -<div class="title">Note</div> -</td> -<td class="content">The buffer is rewound if the read fails. If -1 is returned, -<code>errno</code> must be consulted, like you would do for <code>read(3)</code>. -<code>strbuf_read()</code>, <code>strbuf_read_file()</code> and <code>strbuf_getline()</code> has the -same behaviour as well.</td> -</tr></table> -</div> -</dd> -<dt class="hdlist1"> -<code>strbuf_read</code> -</dt> -<dd> -<p> - Read the contents of a given file descriptor. The third argument can be - used to give a hint about the file size, to avoid reallocs. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_read_file</code> -</dt> -<dd> -<p> - Read the contents of a file, specified by its path. The third argument - can be used to give a hint about the file size, to avoid reallocs. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_readlink</code> -</dt> -<dd> -<p> - Read the target of a symbolic link, specified by its path. The third - argument can be used to give a hint about the size, to avoid reallocs. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_getline</code> -</dt> -<dd> -<p> - Read a line from a FILE *, overwriting the existing contents - of the strbuf. The second argument specifies the line - terminator character, typically <code>'\n'</code>. - Reading stops after the terminator or at EOF. The terminator - is removed from the buffer before returning. Returns 0 unless - there was nothing left before EOF, in which case it returns <code>EOF</code>. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_getwholeline</code> -</dt> -<dd> -<p> - Like <code>strbuf_getline</code>, but keeps the trailing terminator (if - any) in the buffer. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_getwholeline_fd</code> -</dt> -<dd> -<p> - Like <code>strbuf_getwholeline</code>, but operates on a file descriptor. - It reads one character at a time, so it is very slow. Do not - use it unless you need the correct position in the file - descriptor. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_getcwd</code> -</dt> -<dd> -<p> - Set the buffer to the path of the current working directory. -</p> -</dd> -</dl></div> -<div class="paragraph"><p><code>strbuf_add_absolute_path</code></p></div> -<div class="literalblock"> -<div class="content"> -<pre><code>Add a path to a buffer, converting a relative path to an -absolute one in the process. Symbolic links are not -resolved.</code></pre> -</div></div> -<div class="dlist"><dl> -<dt class="hdlist1"> -<code>stripspace</code> -</dt> -<dd> -<p> - Strip whitespace from a buffer. The second parameter controls if - comments are considered contents to be removed or not. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_split_buf</code> -</dt> -<dt class="hdlist1"> -<code>strbuf_split_str</code> -</dt> -<dt class="hdlist1"> -<code>strbuf_split_max</code> -</dt> -<dt class="hdlist1"> -<code>strbuf_split</code> -</dt> -<dd> -<p> - Split a string or strbuf into a list of strbufs at a specified - terminator character. The returned substrings include the - terminator characters. Some of these functions take a <code>max</code> - parameter, which, if positive, limits the output to that - number of substrings. -</p> -</dd> -<dt class="hdlist1"> -<code>strbuf_list_free</code> -</dt> -<dd> -<p> - Free a list of strbufs (for example, the return values of the - <code>strbuf_split()</code> functions). -</p> -</dd> -<dt class="hdlist1"> -<code>launch_editor</code> -</dt> -<dd> -<p> - Launch the user preferred editor to edit a file and fill the buffer - with the file’s contents upon the user completing their editing. The - third argument can be used to set the environment which the editor is - run in. If the buffer is NULL the editor is launched as usual but the - file’s contents are not read into the buffer upon completion. -</p> -</dd> -</dl></div> -</div> -</div> -</div> -<div id="footnotes"><hr /></div> -<div id="footer"> -<div id="footer-text"> -Last updated 2014-09-19 15:32:09 PDT -</div> -</div> -</body> -</html>
diff --git a/user-manual.html b/user-manual.html index 100171b..41c93ac 100644 --- a/user-manual.html +++ b/user-manual.html
@@ -1,5 +1,5 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Git User Manual</title><link rel="stylesheet" type="text/css" href="docbook-xsl.css"><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div lang="en" class="article"><div class="titlepage"><div><div><h2 class="title"><a name="idp50296176"></a>Git User Manual</h2></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl class="toc"><dt><span class="section"><a href="#repositories-and-branches">Repositories and Branches</a></span></dt><dd><dl><dt><span class="section"><a href="#how-to-get-a-git-repository">How to get a Git repository</a></span></dt><dt><span class="section"><a href="#how-to-check-out">How to check out a different version of a project</a></span></dt><dt><span class="section"><a href="#understanding-commits">Understanding History: Commits</a></span></dt><dt><span class="section"><a href="#manipulating-branches">Manipulating branches</a></span></dt><dt><span class="section"><a href="#detached-head">Examining an old version without creating a new branch</a></span></dt><dt><span class="section"><a href="#examining-remote-branches">Examining branches from a remote repository</a></span></dt><dt><span class="section"><a href="#how-git-stores-references">Naming branches, tags, and other references</a></span></dt><dt><span class="section"><a href="#Updating-a-repository-With-git-fetch">Updating a repository with git fetch</a></span></dt><dt><span class="section"><a href="#fetching-branches">Fetching branches from other repositories</a></span></dt></dl></dd><dt><span class="section"><a href="#exploring-git-history">Exploring Git history</a></span></dt><dd><dl><dt><span class="section"><a href="#using-bisect">How to use bisect to find a regression</a></span></dt><dt><span class="section"><a href="#naming-commits">Naming commits</a></span></dt><dt><span class="section"><a href="#creating-tags">Creating tags</a></span></dt><dt><span class="section"><a href="#browsing-revisions">Browsing revisions</a></span></dt><dt><span class="section"><a href="#generating-diffs">Generating diffs</a></span></dt><dt><span class="section"><a href="#viewing-old-file-versions">Viewing old file versions</a></span></dt><dt><span class="section"><a href="#history-examples">Examples</a></span></dt></dl></dd><dt><span class="section"><a href="#Developing-With-git">Developing with Git</a></span></dt><dd><dl><dt><span class="section"><a href="#telling-git-your-name">Telling Git your name</a></span></dt><dt><span class="section"><a href="#creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#how-to-make-a-commit">How to make a commit</a></span></dt><dt><span class="section"><a href="#creating-good-commit-messages">Creating good commit messages</a></span></dt><dt><span class="section"><a href="#ignoring-files">Ignoring files</a></span></dt><dt><span class="section"><a href="#how-to-merge">How to merge</a></span></dt><dt><span class="section"><a href="#resolving-a-merge">Resolving a merge</a></span></dt><dt><span class="section"><a href="#undoing-a-merge">Undoing a merge</a></span></dt><dt><span class="section"><a href="#fast-forwards">Fast-forward merges</a></span></dt><dt><span class="section"><a href="#fixing-mistakes">Fixing mistakes</a></span></dt><dt><span class="section"><a href="#ensuring-good-performance">Ensuring good performance</a></span></dt><dt><span class="section"><a href="#ensuring-reliability">Ensuring reliability</a></span></dt></dl></dd><dt><span class="section"><a href="#sharing-development">Sharing development with others</a></span></dt><dd><dl><dt><span class="section"><a href="#getting-updates-With-git-pull">Getting updates with git pull</a></span></dt><dt><span class="section"><a href="#submitting-patches">Submitting patches to a project</a></span></dt><dt><span class="section"><a href="#importing-patches">Importing patches to a project</a></span></dt><dt><span class="section"><a href="#public-repositories">Public Git repositories</a></span></dt><dt><span class="section"><a href="#sharing-development-examples">Examples</a></span></dt></dl></dd><dt><span class="section"><a href="#cleaning-up-history">Rewriting history and maintaining patch series</a></span></dt><dd><dl><dt><span class="section"><a href="#patch-series">Creating the perfect patch series</a></span></dt><dt><span class="section"><a href="#using-git-rebase">Keeping a patch series up to date using git rebase</a></span></dt><dt><span class="section"><a href="#rewriting-one-commit">Rewriting a single commit</a></span></dt><dt><span class="section"><a href="#reordering-patch-series">Reordering or selecting from a patch series</a></span></dt><dt><span class="section"><a href="#interactive-rebase">Using interactive rebases</a></span></dt><dt><span class="section"><a href="#patch-series-tools">Other tools</a></span></dt><dt><span class="section"><a href="#problems-With-rewriting-history">Problems with rewriting history</a></span></dt><dt><span class="section"><a href="#bisect-merges">Why bisecting merge commits can be harder than bisecting linear history</a></span></dt></dl></dd><dt><span class="section"><a href="#advanced-branch-management">Advanced branch management</a></span></dt><dd><dl><dt><span class="section"><a href="#fetching-individual-branches">Fetching individual branches</a></span></dt><dt><span class="section"><a href="#fetch-fast-forwards">git fetch and fast-forwards</a></span></dt><dt><span class="section"><a href="#forcing-fetch">Forcing git fetch to do non-fast-forward updates</a></span></dt><dt><span class="section"><a href="#remote-branch-configuration">Configuring remote-tracking branches</a></span></dt></dl></dd><dt><span class="section"><a href="#git-concepts">Git concepts</a></span></dt><dd><dl><dt><span class="section"><a href="#the-object-database">The Object Database</a></span></dt><dt><span class="section"><a href="#the-index">The index</a></span></dt></dl></dd><dt><span class="section"><a href="#submodules">Submodules</a></span></dt><dd><dl><dt><span class="section"><a href="#_pitfalls_with_submodules">Pitfalls with submodules</a></span></dt></dl></dd><dt><span class="section"><a href="#low-level-operations">Low-level Git operations</a></span></dt><dd><dl><dt><span class="section"><a href="#object-manipulation">Object access and manipulation</a></span></dt><dt><span class="section"><a href="#the-workflow">The Workflow</a></span></dt><dt><span class="section"><a href="#examining-the-data">Examining the data</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees">Merging multiple trees</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees-2">Merging multiple trees, continued</a></span></dt></dl></dd><dt><span class="section"><a href="#hacking-git">Hacking Git</a></span></dt><dd><dl><dt><span class="section"><a href="#object-details">Object storage format</a></span></dt><dt><span class="section"><a href="#birdview-on-the-source-code">A birds-eye view of Git’s source code</a></span></dt></dl></dd><dt><span class="section"><a href="#glossary">Git Glossary</a></span></dt><dt><span class="appendix"><a href="#git-quick-start">A. Git Quick Reference</a></span></dt><dd><dl><dt><span class="section"><a href="#quick-creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#managing-branches">Managing branches</a></span></dt><dt><span class="section"><a href="#exploring-history">Exploring history</a></span></dt><dt><span class="section"><a href="#making-changes">Making changes</a></span></dt><dt><span class="section"><a href="#merging">Merging</a></span></dt><dt><span class="section"><a href="#sharing-your-changes">Sharing your changes</a></span></dt><dt><span class="section"><a href="#repository-maintenance">Repository maintenance</a></span></dt></dl></dd><dt><span class="appendix"><a href="#todo">B. Notes and todo list for this manual</a></span></dt></dl></div><p>Git is a fast distributed revision control system.</p><p>This manual is designed to be readable by someone with basic UNIX +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Git User Manual</title><link rel="stylesheet" type="text/css" href="docbook-xsl.css"><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div lang="en" class="article"><div class="titlepage"><div><div><h2 class="title"><a name="idp50297904"></a>Git User Manual</h2></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl class="toc"><dt><span class="section"><a href="#repositories-and-branches">Repositories and Branches</a></span></dt><dd><dl><dt><span class="section"><a href="#how-to-get-a-git-repository">How to get a Git repository</a></span></dt><dt><span class="section"><a href="#how-to-check-out">How to check out a different version of a project</a></span></dt><dt><span class="section"><a href="#understanding-commits">Understanding History: Commits</a></span></dt><dt><span class="section"><a href="#manipulating-branches">Manipulating branches</a></span></dt><dt><span class="section"><a href="#detached-head">Examining an old version without creating a new branch</a></span></dt><dt><span class="section"><a href="#examining-remote-branches">Examining branches from a remote repository</a></span></dt><dt><span class="section"><a href="#how-git-stores-references">Naming branches, tags, and other references</a></span></dt><dt><span class="section"><a href="#Updating-a-repository-With-git-fetch">Updating a repository with git fetch</a></span></dt><dt><span class="section"><a href="#fetching-branches">Fetching branches from other repositories</a></span></dt></dl></dd><dt><span class="section"><a href="#exploring-git-history">Exploring Git history</a></span></dt><dd><dl><dt><span class="section"><a href="#using-bisect">How to use bisect to find a regression</a></span></dt><dt><span class="section"><a href="#naming-commits">Naming commits</a></span></dt><dt><span class="section"><a href="#creating-tags">Creating tags</a></span></dt><dt><span class="section"><a href="#browsing-revisions">Browsing revisions</a></span></dt><dt><span class="section"><a href="#generating-diffs">Generating diffs</a></span></dt><dt><span class="section"><a href="#viewing-old-file-versions">Viewing old file versions</a></span></dt><dt><span class="section"><a href="#history-examples">Examples</a></span></dt></dl></dd><dt><span class="section"><a href="#Developing-With-git">Developing with Git</a></span></dt><dd><dl><dt><span class="section"><a href="#telling-git-your-name">Telling Git your name</a></span></dt><dt><span class="section"><a href="#creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#how-to-make-a-commit">How to make a commit</a></span></dt><dt><span class="section"><a href="#creating-good-commit-messages">Creating good commit messages</a></span></dt><dt><span class="section"><a href="#ignoring-files">Ignoring files</a></span></dt><dt><span class="section"><a href="#how-to-merge">How to merge</a></span></dt><dt><span class="section"><a href="#resolving-a-merge">Resolving a merge</a></span></dt><dt><span class="section"><a href="#undoing-a-merge">Undoing a merge</a></span></dt><dt><span class="section"><a href="#fast-forwards">Fast-forward merges</a></span></dt><dt><span class="section"><a href="#fixing-mistakes">Fixing mistakes</a></span></dt><dt><span class="section"><a href="#ensuring-good-performance">Ensuring good performance</a></span></dt><dt><span class="section"><a href="#ensuring-reliability">Ensuring reliability</a></span></dt></dl></dd><dt><span class="section"><a href="#sharing-development">Sharing development with others</a></span></dt><dd><dl><dt><span class="section"><a href="#getting-updates-With-git-pull">Getting updates with git pull</a></span></dt><dt><span class="section"><a href="#submitting-patches">Submitting patches to a project</a></span></dt><dt><span class="section"><a href="#importing-patches">Importing patches to a project</a></span></dt><dt><span class="section"><a href="#public-repositories">Public Git repositories</a></span></dt><dt><span class="section"><a href="#sharing-development-examples">Examples</a></span></dt></dl></dd><dt><span class="section"><a href="#cleaning-up-history">Rewriting history and maintaining patch series</a></span></dt><dd><dl><dt><span class="section"><a href="#patch-series">Creating the perfect patch series</a></span></dt><dt><span class="section"><a href="#using-git-rebase">Keeping a patch series up to date using git rebase</a></span></dt><dt><span class="section"><a href="#rewriting-one-commit">Rewriting a single commit</a></span></dt><dt><span class="section"><a href="#reordering-patch-series">Reordering or selecting from a patch series</a></span></dt><dt><span class="section"><a href="#interactive-rebase">Using interactive rebases</a></span></dt><dt><span class="section"><a href="#patch-series-tools">Other tools</a></span></dt><dt><span class="section"><a href="#problems-With-rewriting-history">Problems with rewriting history</a></span></dt><dt><span class="section"><a href="#bisect-merges">Why bisecting merge commits can be harder than bisecting linear history</a></span></dt></dl></dd><dt><span class="section"><a href="#advanced-branch-management">Advanced branch management</a></span></dt><dd><dl><dt><span class="section"><a href="#fetching-individual-branches">Fetching individual branches</a></span></dt><dt><span class="section"><a href="#fetch-fast-forwards">git fetch and fast-forwards</a></span></dt><dt><span class="section"><a href="#forcing-fetch">Forcing git fetch to do non-fast-forward updates</a></span></dt><dt><span class="section"><a href="#remote-branch-configuration">Configuring remote-tracking branches</a></span></dt></dl></dd><dt><span class="section"><a href="#git-concepts">Git concepts</a></span></dt><dd><dl><dt><span class="section"><a href="#the-object-database">The Object Database</a></span></dt><dt><span class="section"><a href="#the-index">The index</a></span></dt></dl></dd><dt><span class="section"><a href="#submodules">Submodules</a></span></dt><dd><dl><dt><span class="section"><a href="#_pitfalls_with_submodules">Pitfalls with submodules</a></span></dt></dl></dd><dt><span class="section"><a href="#low-level-operations">Low-level Git operations</a></span></dt><dd><dl><dt><span class="section"><a href="#object-manipulation">Object access and manipulation</a></span></dt><dt><span class="section"><a href="#the-workflow">The Workflow</a></span></dt><dt><span class="section"><a href="#examining-the-data">Examining the data</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees">Merging multiple trees</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees-2">Merging multiple trees, continued</a></span></dt></dl></dd><dt><span class="section"><a href="#hacking-git">Hacking Git</a></span></dt><dd><dl><dt><span class="section"><a href="#object-details">Object storage format</a></span></dt><dt><span class="section"><a href="#birdview-on-the-source-code">A birds-eye view of Git’s source code</a></span></dt></dl></dd><dt><span class="section"><a href="#glossary">Git Glossary</a></span></dt><dt><span class="appendix"><a href="#git-quick-start">A. Git Quick Reference</a></span></dt><dd><dl><dt><span class="section"><a href="#quick-creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#managing-branches">Managing branches</a></span></dt><dt><span class="section"><a href="#exploring-history">Exploring history</a></span></dt><dt><span class="section"><a href="#making-changes">Making changes</a></span></dt><dt><span class="section"><a href="#merging">Merging</a></span></dt><dt><span class="section"><a href="#sharing-your-changes">Sharing your changes</a></span></dt><dt><span class="section"><a href="#repository-maintenance">Repository maintenance</a></span></dt></dl></dd><dt><span class="appendix"><a href="#todo">B. Notes and todo list for this manual</a></span></dt></dl></div><p>Git is a fast distributed revision control system.</p><p>This manual is designed to be readable by someone with basic UNIX command-line skills, but no previous knowledge of Git.</p><p><a class="xref" href="#repositories-and-branches" title="Repositories and Branches">the section called “Repositories and Branches”</a> and <a class="xref" href="#exploring-git-history" title="Exploring Git history">the section called “Exploring Git history”</a> explain how to fetch and study a project using git—read these chapters to learn how to build and test a particular version of a software project, search for